ソースジェネレータ SOURCERY ――――――――――――――――――――――――――――――――――――――― Oh!X 1988年12月号掲載 S−OS SWORD マシン語 SOURCERY.SOS       03000H−047FFH S:03000H ソース  SOURCERY.ASC 起動方法 SOURCERY.SOSをロード J3000 コールドスタート 03000H ホット スタート 03003H ――――――――――――――――――――――――――――――――――――――― お待たせしました。 ZINGに代わるS−OS用の高機能ソースジェネレータの登場です。 大きなオブジェクトプログラムも半自動的にソース生成可能。 もちろん、 オフセット機能付きですので3000Hからのものでも大丈夫。 皆さん活用してください。 ・―               ―・ |  ソースジェネレータってなに? | ・―               ―・ このプログラムはマシン語のプログラムを エディタアセンブラZEDAでアセンブルできる ソースプログラムに変換するためのツールです。 たとえば、Oh!Xに掲載されているような、 マシン語プログラムは通常ダンプリストで入力しますね。 しかし、ダンプリストをながめていても、 プログラムがなにをやっているかというのは、 なかなかわからないものです。 ソースリストが掲載されていれば、 それを参考にアルゴリズムを読んでいくこともできますが、 自分なりにプログラムを変更しようとすると パッチあて(変更部分を外に出してツギハギをすること)せざるをえず、 プログラムが汚くなり混乱のもとになります。 こんなとき、ソースリストがあれば なんの問題もなくプログラムの修正ができ、 なによりもそれをソフトウェア資産として、 ほかのプログラム開発に役立てることもできるでしょう。 ソースプログラムから 16進のオブジェクトプログラムが作れるなら、 オブジェクトプログラムから もとのソースプログラムが作れないか? こういう観点から登場したのが ソースジェネレータというツールなのです。 S−OS用のソースジェネレータにはこれまで ZINGというものがありました。 しかし、ZINGはもうほとんど入手不可能ですし、 必ずしも使い勝手のよいものではありません。 加えて、ZEDAがZEDA3までバージョンアップされ、 デバッガにもTRADEという強力なものが現れているのに、 ソースジェネレータはZINGしか発表されていません。 そこで、今回ZINGベースに大幅な機能アップを試みてみました。 それがこのSOURCERYです。 ・―               ―・ |     入力と実行       | ・―               ―・ MACINTO−Cなどのマシン語入力ツールを用いて リスト1のとおりに入力してください。 当然ながら、各ブロックごとに チェックサムとCRCチェックバイトを よく確認するのを忘れないでください。 実行は3000Hのコールドスタート、 3003Hのホットスタートアドレスに ジャンプすることで行われます。 ロード直後には必ずコールドスタートヘ、 前回の作業を継続して行いたいときには ホットスタートヘジャンプしてください。 起動するとカーソルが点滅しコマンド入力待ちの状態になります。 ここで使用できるコマンドについて解説しましょう。 L[*or/]adr1[adr2] アドレスで指定した範囲をラベルつきで逆アセンブルします。 もっともラベルといっても、 原作者のつけたラベルは知りようがありませんので、 アドレスに#マークをつけたもので代用されます。 Lの後ろに/をつけると、 両面表示と同時にメモリ上にソースジェネレートを行います。 Lの後ろに*をつけたときはソースジェネレートのみを行います。 また最終アドレスは省略可能です。 N 逆アセンブルを再開します。 Lコマンドでソースの生成中メモリ不足などでエラーが発生したり、 ブレイクによって中断されたとき、 このコマンドで逆アセンブルを再開することができます。 たとえば、大きなオブジェクトはエラーが出るまでソース生成を行い、 そのたびにSコマンドでソースをセーブ、 ソース生成の再開をしていけば分割逆アセンブルすることができます。 X[adr] L、Nコマンドで生成するソースの格納アドレスを設定します。 アドレスを省略すると現在のソース格納状況を表示します。 コールドスタート時には4E00Hが設定されます。 O adr L、M、D、Fコマンドでのオフセットアドレスを指定します。 たとえば、3000Hて動作するプログラムを A000Hから読み込んでいる場合は、  O7000  L3000 とすれば、ちゃんと3000Hから動作するプログラムとして 逆アセンブルできます。 M[B or W or M or S][adr1 adr2] 指定範囲をデータエリアとして登録します。 MB、MW、MM、MSの各コマンドで指定された部分は それぞれDB、DW、DM、DSの形式でデー夕として出力されます。 アドレスを省略すると現在登録されている データエリアのアドレスを表示します。 &[adr] 指定されたアドレスを先頭アドレスとして 登録されているデータエリアの登録を解除します。 アドレスを省略するとすべてのデータエリアの登録を解除します。 C[adr][CODE][SIZE] 特殊サブルーチンの指定解除を行います。 ここでいう特殊サブルーチンとは S−OSの#MPRNTのように CALL文の直後にデータを持つようなサブルーチンのことです。   C adr SIZE   (1)   C adr 00 CODE (2) のような書式でサブルーチンを登録します。 このとき、 (1)では指定されたアドレスに続くSIZEバイト分のエリアをデータとみなし、 (2)では後続のデータ数が不定であるサブルーチンに適用するもので、 データ数を0に指定し、その直後にデータのエンドコードを表記してください (データは16進2桁で指定)。 TRADEのESコマンドとほぼ同様ですが、 アドレスにラベル名を使うことはできません。 (1)はS−OSの#PAUSE、 (2)は#MPRNTのようなルーチンに使用してください。 SOURCERYでは以上の2つのルーチンは 初めから登録されていますが、 例として#MPRNTを登録してみましょう。 この場合、   C1FE2 00 00 となります。 Cの直後に#PRNTのアドレス、続いてデータ数不定の00、 エンドコードの00を並べているわけです。 データを省略すると(アドレスだけ)、 そのアドレスのデータ登録をクリアし、 Cのみを入力すると現在登録されている すべての特殊サブルーチンを表示します。 S filename 生成したソースを指定のファイル名でセーブします。 D adr1[adr2] アドレスで指定した範囲のダンプリストを表示します。 最終アドレスを省略すると最初の 128バイトだけ表示します。 表示内容はそのままスクリーンエディット可能です。 当然、エディット時もオフセットは有効です。 F adr1 adr2 DATA…… 指定範囲からDATAをサーチし、アドレスとともに出力します。 データは複数個指定可能で 16進数かダブルクォーテーションでくくった文字列で指定します。 J adr 指定したアドレスヘジャンプします。 # このコマンドを実行するたびにプリンタヘの出力をON/OFFします。 ! S−OSのホットスタートヘジャンプします。 ・―               ―・ | SOURCERYのソースを作る | ・―               ―・ それではソースジェネレータを使ってみましょう。 ここでは、SOURCERY自身のソースを生成してみます。 とりあえず、SOURCERYを起動してみてください。 まず、データエリアの登録を行います。 Mコマンドを用いて以下のように設定を行ってください。   MB39C9 39CA   MM44AE 4714   MB4715 4728   MW4729 476C   MB476D 478C   MS478D 次に特殊サブルーチンのセットを行います。 SOURCERY内部では特殊サブルーチンを2ヵ所で使っています。 両方ともエンドコードが00Hなので、   C4069 00 00   C415B 00 00 とします。 これで下準備は終わりです。 もう一度データを確認して、   L/3000 47FF でソースジェネレートしてください。 メモリオーバーが発生したら、適当なファイル名をつけてセーブし、 Nコマンドで操作を再開してください (MZ−80K/Cでなければメモリオーバーを起こさないはずですが)。 ソースジェネレートが終了したら、セーブを行います。 ソースは4E00Hから出力されていますので、 そのままZEDAを起動してソースをのぞいてみましょう。 ZEDAのエディットモードから、   X4E00   R   BT のように操作してください。 ただし、このソースは実行中のプログラムから強引に生成したものですから、 ワークエリアの内容が書き換わっています。 使用するときには本誌に掲載されているソースに従ってワークを書き換え、 ラベルなども整えておいてください。 ・―               ―・ |    プログラムについて    | ・―               ―・ このプログラムは1985年8月号掲戟の ソースジェネレータZINGを基本として 新しく作り直されたものです。 ZINGに対して大きく改良された点は、 データエリアの処理です。 従来のMコマンドを機能別に分けたことや Cコマンドを追加したことにより、 データエリアの分離が格段に楽になりました。 次の特徴としては ZEDAの疑似マクロに対応していることが挙げられます。 逆アセンブルしてみるとわかると思いますが、 リスト中に“IF〜JR”などの命令を見ることができます。 SOURCERYでは、“IF〜THEN(ELSE)”を除く すべてのマクロ命令をサポートしています (好き嫌いはあるでしょうが)。 プログラムを3000Hから配置したことで、 メモリを最大限に使用でき、 ソース作成中はオブジェクトエリアのチェックを行っているので、 ソースとオブジェクトが重なる心配もありません。 さらに特殊ワークをチェックして8Kバイト以上あれば 内部ルーチンを切り換え、検索を高速化しています。 ZINGを使っていた人は逆アセンブル速度に驚くことでしょう。 そのほか、基本的な操作はZINGと変わらないので、 これまでZINGを使っていた人でも 気軽に使うことができるはずです。 とにかく、久々に発表されたソースジェネレータです。 マシン語のプログラムの解析や改造など 皆さんなりの使い方で役立ててください。